import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm

# 设置中文字体路径
font_path = 'E:/下载/SimHei.ttf'  # 替换为字体文件的实际路径
font_prop = fm.FontProperties(fname=font_path)  # 加载字体属性

# 将字体设置为全局默认字体
plt.rcParams['font.sans-serif'] = [font_prop.get_name()]  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题

# 加载数据集
data_user = pd.read_csv('user_action.csv')  # 从CSV文件加载用户行为数据

# 数据预处理：分割天(date)和小时(hour)
data_user['date'] = pd.to_datetime(data_user['time'].str.split(' ').str[0])  # 提取日期并转换为datetime格式
data_user['hour'] = data_user['time'].str.split(' ').str[1].astype('int64')  # 提取小时并转换为整数

# 转换字段类型
data_user = data_user.astype({
    'user_id': 'object',  # 用户ID为对象类型
    'item_id': 'object',  # 商品ID为对象类型
    'item_category': 'object',  # 商品类别为对象类型
    'hour': 'int64'  # 小时为64位整数
})

# 定义一个函数来计算转化率
def calculate_conversion_rates(data, label=""):
    behavior_type = data.groupby(['behavior_type'])['user_id'].count()  # 按行为类型统计用户数量

    # 提取不同行为的数量，防止索引错误
    click_num = behavior_type.get(1, 0)  # 获取点击行为的数量
    fav_num = behavior_type.get(2, 0)  # 获取收藏行为的数量
    add_num = behavior_type.get(3, 0)  # 获取加购行为的数量
    pay_num = behavior_type.get(4, 0)  # 获取购买行为的数量

    # 计算加购/收藏行为的总数
    fav_add_num = fav_num + add_num

    # 计算并打印转化率
    if click_num > 0:
        click_to_fav_add_rate = 100 * fav_add_num / click_num  # 计算点击到加购/收藏的转化率
        click_to_pay_rate = 100 * pay_num / click_num  # 计算点击到购买的转化率
    else:
        click_to_fav_add_rate = 0
        click_to_pay_rate = 0

    if fav_add_num > 0:
        fav_add_to_pay_rate = 100 * pay_num / fav_add_num  # 计算加购/收藏到购买的转化率
    else:
        fav_add_to_pay_rate = 0

    print(f'{label} 加购/收藏转化率：{click_to_fav_add_rate:.2f}%')
    print(f'{label} 点击到购买转化率: {click_to_pay_rate:.2f}%')
    print(f'{label} 加购/收藏到购买转化率: {fav_add_to_pay_rate:.2f}%\n')

    return click_to_fav_add_rate, click_to_pay_rate, fav_add_to_pay_rate

# 计算整体数据的转化率
overall_rates = calculate_conversion_rates(data_user, "整体数据")

# 计算双十二当天的转化率
data_user_1212 = data_user.loc[data_user['date'] == '2014-12-12']  # 筛选双十二的数据
double12_rates = calculate_conversion_rates(data_user_1212, "双十二")

# 可视化转化率对比
labels = ['加购/收藏转化率', '点击到购买转化率', '加购/收藏到购买转化率']  # 标签
x = np.arange(len(labels))  # x轴位置
width = 0.35  # 柱状图宽度

fig, ax = plt.subplots(figsize=(10, 6))  # 创建一个图形和子图
bars1 = ax.bar(x - width / 2, overall_rates, width, label='整体数据')  # 绘制整体数据的柱状图
bars2 = ax.bar(x + width / 2, double12_rates, width, label='双十二')  # 绘制双十二数据的柱状图

# 手动设置中文标题和标签
ax.set_xlabel('转化率类型', fontproperties=font_prop)  # x轴标签
ax.set_ylabel('转化率 (%)', fontproperties=font_prop)  # y轴标签
ax.set_title('整体数据与双十二的转化率对比', fontproperties=font_prop)  # 标题
ax.set_xticks(x)  # 设置x轴刻度位置
ax.set_xticklabels(labels, fontproperties=font_prop)  # 设置x轴刻度标签
ax.legend()  # 添加图例

# 在柱状图上标注数值
for bars in [bars1, bars2]:
    ax.bar_label(bars, fmt='%.2f%%')  # 显示柱状图上的数值标签

plt.show()  # 显示图形
